package main

import (
	"fmt"
	"strconv"
)

/**
 基础数据类型：
1、数值型：
   ① 整数类型 ：int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte
   ② 浮点类型 ： float32,float64
2、字符型（没有单独的字符型，使用byte来保存单个字母字符）
3、布尔型： bool
4、字符串： string

派生数据类型/复杂数据类型
1、指针
2、数组
3、结构体
4、管道
5、函数
6、切片
7、接口
8、map
*/

// 全局变量
var n10 = 100
var n11 = "js"

var (
	n12 = 400
	n13 = "ddf"
)

func main() {
	// 第一种，声明类型，赋值变量值
	// 声明一个变量
	var age int
	// 赋值一个变量
	age = 19
	// 输出一个变量
	fmt.Println("int:", age)

	// 第二种 ，省略类型
	var num3 = 10
	var string1 = "3"
	fmt.Println(string1, num3)

	// 第三种,省略 var
	sex := "男"
	fmt.Println(sex)

	// 第四种 ，同时声明多个变量
	var n1, n2, n3 int // int 默认值 0
	fmt.Println(n1)
	fmt.Println(n2)
	fmt.Println(n3)

	// 第五种 ，同时声明多个变量及类型并直接赋值
	var n4, name, n5 = 10, "jack", 7.9
	fmt.Println(n4)
	fmt.Println(name)
	fmt.Println(n5)

	// 第六种，同时声明多个变量并直接赋值(不声明var)
	n6, n7 := 9.1, "hello"
	fmt.Println(n6)
	fmt.Println(n7)

	// 全局变量
	fmt.Println(n10)
	fmt.Println(n11)
	fmt.Println(n12)
	fmt.Println(n13)

	// 字符串
	str := `	fmt.Println(n10)
	fmt.Println(n11)
	fmt.Println(n12)
	fmt.Println(n13)`
	fmt.Println(str)

	// 类型转换
	var n15 int = 10
	fmt.Println(n15)
	var n16 float32 = float32(n15)
	fmt.Println(n16)

	// 整数类型等其他位数不匹配的转换，需要指定类型才可以正常处理数据，不然数据会异常
	var n17 int32 = 10
	var n18 int64 = int64(n17) + 32
	fmt.Println(n18)

	// 字符串转 bool
	var s1 string = "true"
	var b bool
	// ParseBool 这个函数返回值有两个：(value , error)
	// value是我们得到的bool类型值，error是出现的错误
	// 我们目前只关注得到的bool数据，error可以用 _ 直接忽略
	b, _ = strconv.ParseBool(s1)
	fmt.Printf("b的类型是: %T,b=%v \n", b, b)

	ass := 10
	ass = 334
	fmt.Println(ass)

	// 数组
	var arr [4]int
	arr[0] = 10
	fmt.Println(arr)

	aacc := [5]string{"2", "3", "4", "5"}
	fmt.Println(aacc)

	vvva := [...]string{"2", "3", "4", "5"}
	fmt.Println(vvva)
	fmt.Println(vvva[2])

	// map
	mp := make(map[int]string, 5)
	mp[1] = "one"
	mp[2] = "two"
	mp[3] = "three"
	fmt.Println(mp)

	mpp := map[string]interface{}{
		"username": "张三",
		"sex":      "男",
		"age":      3,
		"phone":    "134567777",
	}
	fmt.Println(mpp)
}
